package com.caption.jdk.stream;

import com.caption.jdk.lambda.Person;

import java.util.List;
import java.util.stream.Collectors;
import java.util.stream.IntStream;
import java.util.stream.Stream;

/**
 * stream 方法
 * reduce、mapToInt、concat
 */
public class TestStream03 {
    public static void main(String[] args) {
        /**
         * reduce方法 identity默认值， 第一次会把默认值赋值给x，后面每次x的值都是上一次计算结果， y是每一次从集合中取的元素
         */
        Integer sum = Stream.of(4, 5, 3, 9).reduce(0, (x, y) -> {
            System.out.println("x=" + x + ",y=" + y);
            return x + y;
        });
        System.out.println(sum);
        /**
         * 计算所有人年龄之和
         */
        Integer age = Stream.of(new Person("张三", 20),
                        new Person("李四", 30),
                        new Person("王五", 25))
                .map(Person::getAge)  //转换为Integer
                .reduce(0, (x, y) -> x + y);
        System.out.println(age);

        /**
         * 求年龄最大的
         */
        Integer max = Stream.of(new Person("张三", 20),
                new Person("李四", 30),
                new Person("王五", 25)).map(Person::getAge).reduce(0, (x, y) -> x > y ? x : y);
        System.out.println(max);

        /**
         * 统计字符a出现次数
         */
        Integer total = Stream.of("a", "b", "c", "a", "c", "a")
                .map(c -> c.equals("a") ? 1 : 0)
                .reduce(0, Integer::sum); //Integer::sum 调用Integer类的sum方法对x和y进行求和
        System.out.println(total);

        /**
         *mapToInt方法 由于Integer类型占用的内存要比int类型大，在stream计算时可以先转换为IntStream进行计算效率就会比较高
         */
        Integer arr[] = {1, 2, 3, 5, 6, 8};
        IntStream intStream = Stream.of(arr).mapToInt(Integer::intValue);
        intStream.filter(i -> i > 3).sum();

        /**
         * concat方法,两个stream进行合并操作
         */
        Stream<String> stream1 = Stream.of("a", "b", "c");
        Stream<String> stream2 = Stream.of("x", "y", "z");
        List<String> concatList = Stream.concat(stream1,stream2).collect(Collectors.toList());
        System.out.println(concatList);
    }
}
